﻿// See https://aka.ms/new-console-template for more information
using System;
using System.Text.Json;
using System.Xml;
using Demos.Threads;
using Demos.Threads.Services;

System.Console.WriteLine("Hello, World!");

#region 1 运行单个线程
{
    SingleThread.Start();
}
#endregion

#region 2 运行多个线程
{
    DoubleThread.Start();
}
#endregion

#region 3 线程传参数
{
    ParamsThread.Start();

}
#endregion

#region 4 多线程带返回值
{
    ExecResultThread.Start();
}

#endregion

#region 5 线程池使用
{

    ThreadPoolTest.Start();
}
#endregion

#region 6 多线程+线程池配置
{
    ThreadPoolTest.Start2();
}
#endregion

#region 7 Task运行多线程
{
    DoubleThread.Start2();
}
#endregion

#region 8 并行运行多个线程任务
{
    DoubleThread.Start3();
}
#endregion

#region 9 并行运行多个任务，指定CPU核心书
{
    DoubleThread.Start4();
}
#endregion

#region 10 多线程并发执行
{
    DoubleThread.Start5();
}
#endregion

#region 11 多线程-线程等待
{
    //创建子线程
    Task task = Task.Run(() =>
    {
        //2 子线程执行
        UserService userService = new UserService();
        System.Console.WriteLine("子线程开始执行...");
        userService.GetUserByName("zhangsan");
        Task.Delay(2000).Wait();// 模拟延迟
        System.Console.WriteLine("子线程执行完成...");
    });

    //等待所有子线程执行完成
    task.Wait();

    //执行主线程
    System.Console.WriteLine("主线执行完成...");

}

#endregion

#region 12 多线程-线程中断执行
{
    //1 创建CancellationTokenSource
    using CancellationTokenSource cts = new CancellationTokenSource();
    CancellationToken cancellationToken = cts.Token;

    //2 创建子线程
    Task task = Task.Run(() =>
    {
        System.Console.WriteLine("子线程执行...");
        for (int i = 0; i < 10; i++)
        {
            if (cancellationToken.IsCancellationRequested)
            {
                System.Console.WriteLine("子线程中断执行...");
                //抛出异常
                cancellationToken.ThrowIfCancellationRequested();
            }
            //执行子线程业务代码
            System.Console.WriteLine("执行子线程业务代码...");
            Task.Delay(500).Wait();//模拟等待500毫秒执行完成
            //子线程执行完成
            System.Console.WriteLine($"子线程{i}执行完成");
        }
    }, cancellationToken);

    //主线程执行
    Task.Delay(1000).Wait();//模拟主线程执行耗时

    try
    {
        //等待子线程执行完成
        task.Wait();
    }
    catch (Exception e)
    {

        System.Console.WriteLine("子线程任务取消...");
    }

    System.Console.WriteLine(" 主线程执行完成...");
}
#endregion



